#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <unistd.h>

#define PROCESS_NUM 5

// 函数指针类型
typedef void (*func_t)();

void DownloadTask()
{
    printf("-----------下载任务--------\n");
    sleep(1);
}

void ioTask()
{
    printf("-----------IO任务----------\n");
}

void flushTask()
{
    printf("-----------刷新任务----------\n");
}

typedef struct SubEd
{
    /* data */
    int num;
    char *name;
    int subId; // 子进程Id
    int writeFd;
    void (*subEp)(char *name, int subId, int writeFd); // 指针函数
} SubEd;

// 通过父进程创建多个子进程，然后父进程写入，子进程读取到输入的数据，各个子进程应该做什么事.
int main()
{

    int i = 0;
    for (i = 0; i < PROCESS_NUM; i++)
    {
        int fds[2];
        int n = pipe(fds);
        assert(n == 0);
        (void)n;

        // 创建子进程
        int id = fork();
        if (id == 0)
        {
            // 子进程，进行处理任务
            close(fds[1]); // 关闭子进程管道的写端

            exit(0);
        }
        close(fds[0]); // 关闭父进程管道的读端
        SubEd sub = {1, 0, id, fds[1]};
    }
    // 2. 走到这里就是父进程，控制子进程
    // 创建一个存放子进程执行任务的方法表(函数指针数组)
    func_t func_t[] = {DownloadTask, ioTask, flushTask};
    int quit = 1;
    while (1)
    {
        // 1.选择一个子进程

        // 2. 选择一个任务

        // 3. 任务发送给选择的进程
    }

    // 3. 回收子进程信息

    return 0;
}